/*
 * CTCPClient.h
 *
 *  Created on: 05.03.2012
 *      Author: caffeine
 */

#ifndef __CTCPCLIENT_H__
#define __CTCPCLIENT_H__
#include <lampe/config.h>

#include <lampe/network/tcp/ITCPClient.h>
#include "../../lib/socketlib.h"

#include "../../stream/tcp/CTCPReader.h"
#include "../../stream/tcp/CTCPWriter.h"
#include "../CClient.h"
#include <lampe/network/IClientCallback.h>

namespace lampe{
namespace network{


/**
 * @class CTCPClient
 * Класс реализующий работу TCP клиента
 */
class CTCPClient:public virtual ITCPClient,public CClient{
private:
	lampe::stream::tcp::CTCPReader*reader;
	lampe::stream::tcp::CTCPWriter*writer;
	void clearSocket();
protected:
	///указатель на сокет соединения
	SOCKET sock;
public:
	virtual bool onStart();
	virtual void onStop();
	virtual void setConnect(void*data);
	virtual bool isConnected();
	virtual lampe::stream::IReader*getReader();
	virtual lampe::stream::IWriter*getWriter();

	/**
	 * Метод вызывает соединение данного клиента к удалённому серверу
	 *
	 * @param host адресс сервера, к которому нужно подключаться
	 * @param port порт, к которому нужно подключаться
	 * @return TRUE, если соединение установленно. Иначе FALSE
	 */
	virtual bool connectTo(String host,u32 port);

	/**
	 * Отключение от сервера. Может применятся как при отключении от
	 * удалённого сервера, так и клиентов от сервера
	 */
	virtual void Disconnect();

	CTCPClient(IClientCallback*callBack);
	virtual ~CTCPClient();
};



}//namespace network
}//namespace lampe

#endif /* CTCPCLIENT_H_ */
